/**
 * 加载器
 * */
const blog = require('./loader/blog.js');
const weibo = require('./loader/weibo.js');

const loaders = new Map();
const nextloadCheckers = new Map();
const urlFilters = new Map();

// 注册加载方法
loaders.set('blogLoad', blog.loadAction);
loaders.set('weiboLoad', weibo.loadAction);

// 注册检查方法
nextloadCheckers.set('blogCheckNextLoad', blog.needNextLoad);
nextloadCheckers.set('weiboCheckNextLoad', weibo.needNextLoad);

// 注册URL检查方法
urlFilters.set('blogUrlFilter', blog.urlFilter);
urlFilters.set('weiboUrlFilter', weibo.urlFilter);
/**
 * 执行加载方法, 滚动加载 | 分页按钮加载 | URL参数加载 
 * @param {string} methodName - 方法名称
 * @param {import('playwright').Page} page - Playwright 页面对象
 * @param {import('./types/loader.js').ExtraData} extraData - 额外数据
 * @param {import('./types/loader.js').LoaderOptions} options - 配置选项
 */
async function executeLoad(methodName, page, extraData = {}, options = {}) {
    const loader = loaders.get(methodName);
    if (!loader) {
        throw new Error(`加载方法 ${methodName} 未找到`);
    }
    return await loader(page, extraData, options);
}

/**
 * 检查是否继续加载中
 * 返回 true 表示继续加载中，false 表示加载完成
 * @param {string} methodName - 方法名称
 * @param {import('playwright').Page} page - Playwright 页面对象
 * @param {import('./types/loader.js').ExtraData} extraData - 额外数据
 * @param {import('./types/loader.js').LoaderOptions} options - 配置选项
 */
async function checkNextLoad(methodName, page, extraData = {}, options = {}) {
    const checker = nextloadCheckers.get(methodName);
    if (!checker) {
        throw new Error(`检查方法 ${methodName} 未找到`);
    }
    return await checker(page, extraData, options);
}

/**
 * 执行URL检查方法, 返回需要加载的 URL list 
 * @param {string} methodName - 方法名称
 * @param {string[]} urls - 要检查的URL数组
 * @returns {Promise<boolean[]>} 返回检查结果的布尔值数组
 */
async function executeUrlFilters(methodName, urls) {
    const checker = urlFilters.get(methodName);
    if (!checker) {
        throw new Error(`URL检查方法 ${methodName} 未找到`);
    }
    return await checker(urls);
}

module.exports = {
    executeLoad,
    checkNextLoad,
    executeUrlFilters,
};
